package unmsm.fisi.tesis.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
import unmsm.fisi.tesis.coneccion.ConexionWithSQL;
import unmsm.fisi.tesis.entidad.Configuracion;
import unmsm.fisi.tesis.entidad.Cromosoma;
import unmsm.fisi.tesis.entidad.CromosomaFinal;
import unmsm.fisi.tesis.entidad.Poblacion;
import unmsm.fisi.tesis.servicio.ConocimientoFitness;

public class PoblacionDAO {

	
	public void asignarGeneracion(int numGeneracion, String detalle) {
		
		Connection cnx = ConexionWithSQL.obtenerConexion();
		Statement st=null;
		try {
			// creamos el statement
			 st = cnx.createStatement();
			
			String sql = " INSERT INTO SM_GENERACION(NUMEROGENERACION,DETALLE) "+
					" VALUES("  + numGeneracion+","+ detalle +")";
			
			st.executeUpdate(sql);
			cnx.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			 if (st != null) try { st.close(); } catch(Exception e) {e.printStackTrace();}
			 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
            
        }
	}
	
	public static void asignarGeneracionYPoblacion(int numGeneracion,  String detalle, int iteraciones, int poblacionInicial, int poblacionFinal, int codigoConfiguracion) {
		  
		Connection con = ConexionWithSQL.obtenerConexion();
		//con.setAutoCommit(true);
		try {
			   
		      CallableStatement cstmt = con.prepareCall("{call dbo.sp_asignarGeneracionYPoblacion( ?, ?, ?, ?, ?, ?)}");
		      
		      cstmt.setInt("NUMEROGENERACION", numGeneracion);
		      cstmt.setString("DETALLE", detalle);
		      cstmt.setInt("ITERACIONES", iteraciones);
		      cstmt.setInt("NUMEROPOBLACIONINICIAL", poblacionInicial);
		      cstmt.setInt("NUMEROPOBLACIONFINAL", poblacionFinal);
		      cstmt.setInt("CODIGOCONFIGURACION", codigoConfiguracion);
		      //cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
		      cstmt.execute();
		      //System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));
		      cstmt.close();
		   }
		   catch (Exception e) {
		      e.printStackTrace();
		   }
		   finally {
				 if (con != null) try { con.close(); } catch(Exception e) {e.printStackTrace();}
	        }
	}
	
	public static void guardarCromosomasFinalesxGeneracion(String cadena, int numeroGeneracion, int ultimoCromosoma, Cromosoma individuo) {
		  
		Connection con = ConexionWithSQL.obtenerConexion();
		//con.setAutoCommit(true);
		try {
			   
		      CallableStatement cstmt = con.prepareCall("{call dbo.sp_guardarCromosomasFinales( ?, ?, ?, ?, ?, ?)}");
		      
		      cstmt.setInt("NUMEROCROMOSOMA", individuo.getNumeroCromosoma());
		      cstmt.setInt("NUMEROGENERACION", numeroGeneracion);
		      cstmt.setString("CONOCIMIENTO", cadena);
		      cstmt.setInt("NUMEROFILA", individuo.getConocimiento().length);
		      cstmt.setInt("NUMEROCOLUMNA", individuo.getConocimiento()[0].length);
		      cstmt.setInt("ULTIMOCROMOSOMA", ultimoCromosoma);
		      //cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
		      cstmt.execute();
		      //System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));
		      cstmt.close();
		   }
		   catch (Exception e) {
		      e.printStackTrace();
		   }
		   finally {
				 if (con != null) try { con.close(); } catch(Exception e) {e.printStackTrace();}
	        }
	}
	
	public static List obtenerUltimaPoblacionDesdeBaseDeDatos() {
		
		Connection cnx = ConexionWithSQL.obtenerConexion();
		
		List<CromosomaFinal> listcfinales= new ArrayList<CromosomaFinal>();
		CromosomaFinal cromosomaFinal= new CromosomaFinal(); 
		
			try
			{
				
				CallableStatement cstmt = cnx.prepareCall("{call dbo.sp_obtenerCromosomasFinales(  )}");
			   // cstmt.setInt("NUMEROGENERACION", numeroGeneracion);
			     
			    ResultSet rs =  cstmt.executeQuery();
			     
			     
				while(rs.next())
				{
					
					cromosomaFinal.setNumeroGeneracion(rs.getInt("NUMEROGENERACION"));
					cromosomaFinal.setConocimiento(rs.getString("CONOCIMIENTO"));
					cromosomaFinal.setNumerofila(rs.getInt("NUMEROFILA"));
					cromosomaFinal.setNumerocolumna(rs.getInt("NUMEROCOLUMNA"));
					cromosomaFinal.setNumeroCromosoma(rs.getInt("NUMEROCROMOSOMA"));
					cromosomaFinal.setUltimoCromosoma(rs.getInt("ULTIMOCROMOSOMA"));
					listcfinales.add(cromosomaFinal);
				}
				rs.close();
				cstmt.close();
			
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
				System.out.print(e.getMessage());
				
			}finally {
				 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
	        }
			
		return listcfinales;
	}
	
}
